#include <iostream>
#include <vector>
#include "Elemento.h"

using namespace std;

const int MAX_OBJETOS = 20;
const int MAX_PESO = 100;

class Mochila {
  public:
     //setter y getters
     int pesoTotal() { return _pesoTotal; };
     void pesoTotal(int peso) { _pesoTotal=peso; }
     int valorTotal() { return _valorTotal; };
     void valorTotal(int valor) { _valorTotal=valor; }
     int P() { return _P; };
     void P(int tam) { _P=tam; }
     vector<bool> objetos_mochila; //objetos que coge
     vector<Elemento> objetos; //objetos en total
     int n_objetos;

     void generaInstancia(ofstream &fs);
     void generaInstancia(ofstream &fs,int MAX);
     void generaInstanciaDirecta(int MAX);
     void cargaInstancia(ifstream &fs);
     void muestraObjetos();
     void heuristicaValor();
     void heuristicaPeso();
     void heuristicaValorPeso();
     void objetosMochila();
     void exacto();
     void exactoPoda();
     void cargaFichero(string fich);
  private:
     int _pesoTotal; //peso total en la mochila
     int _valorTotal; //valor total en la mochila
     int _P; //tamaño de la mochila
     void heuristica1();
     void ordenaValorPeso();
     void ordenaPesos();
     void ordenaValor();
     void back(vector<bool> &X,  int k, int &max_valor);
     void backPoda(vector<bool> &X,  int k, int &max_valor);
     bool sol_factible(vector<bool> X,int k);
      int valor_acumulado(vector<bool> X,int k);
      int peso_acumulado(vector<bool> X);
     void inicializa();
     int cota(vector<bool> &X, int k);

};
